一個 Deployment YAML 檔案通常由以下幾個基本元素組成:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app-container
image: my-app-image:latest
apiVersion
: 指定了使用的 Kubernetes API 版本,通常為 apps/v1。kind
: 表示資源類型,這裡有一個 Deployment。metadata
: 包含有關 Deployment 的 raw data,包括名稱。spec
: 指定了 Deployment 的規範,包括 replica 數量、selector 和 Pod template。replicas: 3
selector:
matchLabels:
app: my-app
在 template 欄位中定義 Pod 模板,該模板用於建立新的 Pod 副本。 它包括了 Pod 的 meta data 和 specs。
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app-container
image: my-app-image:latest
預設情況下,Deployment 使用滾動更新策略來升級 Pod。 這意味著它將逐步替換舊的 Pod 副本,確保新版本的應用程式逐漸接管流量。我們可以配置滾動更新的速度和失敗閾值。
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
在發生問題時,您可以回滾到先前的版本。 使用 rollbackTo 來指定要回滾到的版本。
rollbackTo:
revision: 2
containers:
- name: my-app-container
image: my-app-image:latest
env:
- name: DB_HOST
value: db-server
volumes:
- name: my-volume
persistentVolumeClaim:
claimName: my-pvc
以下是一個還算完整的 deployment.yaml :
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app-container
image: my-app-image:latest
ports:
- containerPort: 80
resources:
limits:
cpu: "0.5"
memory: "512Mi"
requests:
cpu: "0.2"
memory: "256Mi"
env:
- name: DB_HOST
value: db-server
volumeMounts:
- name: my-volume
mountPath: /data
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
rollbackTo:
revision: 2
volumes:
- name: my-volume
persistentVolumeClaim:
claimName: my-pvc